“La máquina analítica teje patrones algebraicos como el telar de Jacquard teje flores y hojas” (Ada Lovelace)
“Ada Lovelace escribió el primer bucle. Nunca lo olvidaré. Nadie lo olvidará” (Grace Hopper)
“Para mí, solo se entiende algo cuando se puede programar” (Gregory Chaitin)
La Evolución de los Lenguajes de Programación
Un lenguaje de programación es un lenguaje formal de representación de los procesos computacionales, de tal manera que sean comprensibles tanto para el ordenador como para el humano. Es un interfaz, un lenguaje de comunicación o intermediario entre hombre y máquina. Como todo lenguaje formal, debe tener su sintaxis y su semántica bien definidas. Un programa de ordenador es un secuencia de sentencias del lenguaje de programación que instruyen al ordenador para que ejecute una tarea específica.
Los lenguajes de programación tienen una larga historia, una historia que va ligada en paralelo a la evolución de los ordenadores, en los que podemos distinguir las siguientes etapas:
Las primeras máquinas eran calculadoras numéricas y eran de propósito específico: estaban orientadas a realizar una tarea determinada. No eran programables o el programa era fijo. Lo único que variaban eran los datos de entrada.
La siguiente generación de máquinas (como el Colossus y el ENIAC) eran reprogramables a nivel físico. Requerían reconfigurar los conmutadores y recablear las conexiones entre las diversas unidades de la máquina.
En las siguientes máquinas se codificaban las instrucciones en cinta perforada, como el Harvard Mark I.
El gran avance, la gran revolución, vino con el concepto de “programa almacenado en memoria”, que hacía que la máquina fuera flexible y de propósito general o universal. Inicialmente había que trabajar con direcciones físicas de la memoria del ordenador. Luego apareció el lenguaje ensamblador, que permitía trabajar con nombres de variables, en lugar de direcciones. A partir de ese momento, surgieron lenguajes cada vez de mayor nivel de abstracción.
Los lenguajes de programación nacieron a nivel teórico en el siglo XIX con Charles Babbage y Ada Lovelace.
Ada Lovelace −la única hija legítima del poeta Lord Byron, nacida Augusta Ada Byron King, y condesa de Lovelace− fue la gran pionera de los lenguajes de programación. Fue una gran visionaria, pues anticipó muchos de los conceptos vigentes hoy día en un famoso artículo publicado en 1843, mientras analizaba el proyecto de máquina analítica de Charles Babbage.
La máquina analítica de Babbage era un diseño de máquina capaz de realizar cualquier tipo de cálculo. Las instrucciones se introducirían en tarjetas perforadas, como en el telar de Jacquard. El telar de Jacquard es un telar mecánico inventado por el fabricante de tejidos Joseph-Marie Jacquard en 1801. Utilizaba tarjetas perforadas para producir patrones en los tejidos, permitiendo que hasta los más inexpertos pudieran elaborar complejos diseños.
En la máquina analítica ya aparecían los elementos básicos de los modernos ordenadores: memoria, unidad aritmético-lógica, unidad de control y dispositivos de entrada/salida. La máquina analítica no se llegó a construir totalmente por las limitaciones tecnológicas de la época. Babbage es considerado el “padre” de la informática.
En 1843, Ada tradujo al inglés un artículo escrito en francés por el ingeniero italiano Luigi Menabrea sobre la máquina analítica de Babbage. A sugerencia del propio Babbage, añadió unas “Notas de la traductora” que se han hecho famosas. En esas notas especificaba en detalle un método para para calcular los números de Bernouilli. Este método es considerado el primer programa de ordenador de la historia, aunque lógicamente no pudo llegar a ejecutarse porque la máquina no llegó a construirse.
En esas notas, Ada también avanzó una serie de conceptos clave, que tendrían resonancia histórica un siglo después:
El concepto de máquina universal. Una máquina capaz de ser reprogramada para poder realizar diferentes tareas. El programa se introduciría en tarjetas perforadas. Ada enfatizó la diferencia entre la máquina de Pascal (que era una máquina calculadora de las cuatro operaciones aritméticas elementales) y la máquina analítica, que era una máquina universal.
El proceso simbólico. Las operaciones de la máquina universal no tenían por qué limitarse a los números, sino que podrían hacerse con símbolos. La máquina podría almacenar, manipular y procesar cualquier cosa que pudiera expresarse mediante símbolos: matemática, lógica, palabras, música, etc. “Por la palabra ‘operación’ entendemos cualquier proceso que altere la relación mutua entre dos o más cosas, sea dicha relación de la clase que fuere” (Ada Lovelace). Esta idea hoy día se han convertido en realidad gracias a la tecnología digital, que permite representar todo tipo de contenidos: números, texto, imágenes, video, sonido, etc.
El concepto de programa o algoritmo, con tres estructuras:
Subrutina. Secuencia de instrucciones que realiza una tarea repetitiva. Ada imaginó una biblioteca de subrutinas para tareas utilizadas comúnmente.
Bucle recursivo. Secuencia de instrucciones que se repiten.
Bifurcación o “salto condicional”. El salto a una secuencia de instrucciones distintas si se cumple una determinada condición.
Una notación simbólica como un nuevo lenguaje matemático y para desarrollar programas. Con esa notación describió un algoritmo para calcular los números de Bernouilli.
El concepto de combinatoría y su relación con la imaginación. Programar es combinar adecuadamente los recursos primitivos de la máquina para realizar una tarea específica. En esa labor intervenía la imaginación: “¿Qué es la imaginación? Es la facultad de combinación” (Ada Lovelace).
Por último, planteó un tema fascinante: ¿Pueden pensar las máquinas? Ada creía que no, porque sostenía que las máquinas no pueden generar ideas por sí mismas, no tienen iniciativa, solo realizan lo que se les ha programado previamente.
En definitiva, Ada dio el salto conceptual desde la máquina calculadora al ordenador de propósito general. El ordenador, tal y como lo concebimos hoy (un dispositivo universal) fue imaginado por Ada y posteriormente por Turing y Von Neumann.
Grace Hopper escribió el primer manual de programación de la historia, para el ordenador Mark I de Howard Aiken, un volumen de 500 páginas que incluía la historia del ordenador y una guía para programarlo. Lo escribió de una manera sencilla, concisa y clara. El ordenador Mark I recibía las instrucciones en cinta perforada. Las aportaciones de Hopper fueron:
Dio forma al concepto de subrutina de Ada: fragmento de código que se almacena una sola vez y que se podía invocar todas las veces que se necesitara desde el programa principal. También concibió las subrutinas anidadas.
Implemento otra idea de Ada: la biblioteca de subrutinas.
Desarrolló el concepto de compilador: un programa traductor del lenguaje de programación al lenguaje específico de cada máquina. En 1952 desarrolló el primer compilador. Según dijo, inventó el compilador para que “el programador volviera a ser un matemático”. Según Hopper, el lenguaje de programación y los programas deberían ser independientes de la máquina.
Intuyó que el hardware se convertiría en algo secundario, y que verdadero valor de los ordenadores residiría en el lenguaje de programación y el desarrollo de programas.
Contribuyó a popularizar los términos “bug” y “debugging”.
De la idea de subrutina se pasó al concepto más general de módulo. “La modularización y el desarrollo de subrutinas fueron realmente cruciales para aprender a programar” (Jean Jeannings).
Alan Turing concibió una máquina teórica universal basada en una memoria lineal constituida por celdas, estados de máquina y un dispositivo lector/grabador de celda, con el programa almacenado al principio de la memoria.
“Es posible inventar una sola máquina que pueda utilizarse para calcular cualquier secuencia computable” [Turing, 1936].
“La importancia de la máquina universal es evidente. No necesitamos tener una infinidad variedad de máquinas diferentes haciendo trabajos diferentes. Bastará con una sola. El problema de ingeniería de producir varias máquinas para trabajos diversos es reemplazado por el trabajo de oficina de ‘programar’ la máquina universal para hacer estos trabajos” [Turing, 1948].
El lenguaje de programación de la máquina universal de Turing constaba de reglas. Realmente no era un lenguaje formal, sino solo una tabla que relacionaba estados de la máquina y símbolos de la memoria lineal con acciones (modificar un símbolo de una celda, modificar el estado de la máquina y/o desplazarse a la derecha o a la izquierda de la celda).
Turing pensó que si una máquina puede modificar su propio programa en función de la información que fuera procesando, entonces esto se podría considerar una forma de aprendizaje Por ejemplo, una máquina con un programa de jugar al ajedrez podría aprender de sus errores y ajustar sus propias instrucciones. Como las máquinas pueden implementar la lógica, que es el fundamento del razonamiento humano, entonces podrían emular la inteligencia humana, es decir, tener inteligencia artificial.
John von Neumann −matemático de origen húngaro de gran inteligencia y creatividad, mentor de Turing y creador del primer ordenador electrónico digital (el EDVAC)− creó una arquitectura de máquina que se denomina “arquitectura von Neumann” o “arquitectura Princeton”. Esta arquitectura fue presentada en 1945 en el documento “First Draft on the EDVAC”. Promovió la idea de que el programa debería almacenarse en la misma memoria que los datos, pues tendría dos ventajas fundamentales: 1) la máquina podría ser universal, poniendo así en práctica las ideas de Ada y Turing; 2) el propio programa podría automodificarse fácilmente durante su ejecución.
La arquitectura von Neumann divide al ordenador en 4 partes: la unidad aritmética, la unidad de control, la memoria y los dispositivos de entrada/salida. La memoria es una secuencia lineal de celdas y de lectura/escritura (como en la máquina de Turing). Cada celda tiene una dirección y un contenido. Un programa es una secuencia de instrucciones que hacen cambiar los contenidos de las celdas. Su ejecución es secuencial, aunque puede haber “saltos” si se cumplen determinadas condiciones. El paradigma de programación es imperativo, un paradigma que ha perdurado durante muchos años, hasta la aparición de los lenguajes de tercera generación.
Von Neumann también intuyó que la programación de ordenadores tenía que evolucionar, basarse en nuevas ideas fundamentales, pues apenas lo había hecho desde Ada Lovelace. De hecho, inventó un lenguaje de programación con un mecanismo de localización variable que permitía sustituir fácilmente unas instrucciones por otras durante la ejecución del programa.
Generaciones de lenguajes de programación
La clasificación de los lenguajes de programación por generaciones nunca ha sido precisa, tienen una frontera difusa, y ha sido sustituida en la práctica por los paradigmas que soportan. Pero se puede establecer la clasificación siguiente:
Lenguajes de primera generación (1GL). Son los lenguajes de código de máquina, los lenguajes “nativos”, los que entiende directamente la máquina sin necesidad de traducción. Está constituido por 0’s y 1’s.
Lenguajes de segunda generación (2GL), también llamados “de bajo nivel”. Son los lenguajes tipo ensamblador, donde se asignan nombres nemotécnicos a las operaciones y se utilizan nombres para las direcciones de las celdas de memoria. Requieren conocer las instrucciones de la máquina específica.
Lenguajes de tercera generación (3GL), también llamados “de alto nivel”. No requieren conocer las instrucciones de la máquina donde se va a ejecutar. Utilizan paradigmas y abstracciones para simplificar la programación y centrarse en el problema, no en la máquina. Son de tipo procedural.
Lenguajes de cuarta generación (4GL). Son lenguajes declarativos, inteligibles, próximos al lenguaje humano. Por ejemplo, SQL (Structured Query Language), para gestión de bases de datos. Especifican el “qué” se quiere hacer y no el “cómo” se va a hacer.
Lenguajes de quinta generación (5GL). Son los que supuestamente emularían la inteligencia humana. Se concibieron en el proyecto japonés de ordenador de quinta generación.
Lenguajes de alto nivel
Los términos “alto nivel” y “bajo nivel” son relativos:
Hace algunas décadas, el lenguaje C era considerado de alto nivel y el lenguaje ensamblador era considerado de bajo nivel. Hoy día, el lenguaje C se considera de bajo nivel, pues (entre otras cosas) permite acceso directo a la memoria.
El propio lenguaje ensamblador se podía considerar de alto nivel, pues es una representación del código de máquina que contempla variables, procedimientos y estructuras de datos.
A su vez, el código de máquina se puede considerar de un nivel superior al microcódigo usado internamente en los procesadores.
Desde la arquitectura von Neumann, los lenguajes de programación ha evolucionado hacia un mayor nivel de abstracción. En lugar de hablar de conceptos implementadores (registros internos, direcciones de memoria, pilas, etc.), tratan de abstracciones como funciones, procedimientos, subrutinas, objetos, reglas, expresiones aritméticas y lógicas, estructuras de control, abstracción de datos, parametrización, etc. Estas abstracciones reducen la complejidad y permiten desarrollar programas más fácilmente, sin considerar las máquinas en las que se ejecutarán ni temas de eficiencia.
Mencionamos los lenguajes de alto nivel, las abstracciones o paradigmas más importantes:
1945. Plankalkul. Ingeniería. Fue el primer lenguaje de alto nivel no von Neumann. En su época no fue implementado.
1957. Fortran. Cálculo científico. Uno de los primeros lenguajes de alto nivel.
1958. Lisp. Cálculo simbólico e inteligencia artificial. Implementó la notación lambda de Church.
1958. Algol. Algoritmos. Introdujo los conceptos de recursión, función anidada y varios conceptos de programación estructurada (mecanismo if-then-else y bucle while-do). Fue el primer lenguaje con gramática formal, especificada con la notación BNF (Backus-Naur Form).
1959. Cobol. Orientado para uso comercial y de negocios. Concebido como lenguaje autodocumentado. Uno de los lenguajes más utilizados en informática de gestión.
1964. Basic. Lenguaje sencillo de programación orientado a estudiantes.
1968. Pascal. Orientado inicialmente a la enseñanza de la programación. Implementa la programación estructurada y estructuras de datos.
1969. C. Orientado a la programación de sistemas, especialmente para el desarrollo de sistemas operativos.
1970. Forth. Lenguaje y entorno de programación. Imperativo, reflexivo y basado en pilas.
1980. Smalltalk. Primer lenguaje orientado a objetos.
1980. Objetive C. Orientación a objetos, con un modelo parecido a Smalltalk.
1980. Ada. Orientación a objetos. Departamento de Defensa de EE.UU.
1983. C++. C con orientación a objetos. Multiparadigma.
1987. Perl. Orientado a manipulación de texto.
1991. Python. Lenguaje de programación interpretado, con sintaxis legible. Es multiparadigma: programación imperativa, orientación a objetos y funcional.
1991. Visual Basic. Dialecto de Basic orientado a eventos. Simplifica la programación gracias a un entorno de desarrollo.
1995. PHP. Lenguaje para desarrollo de aplicaciones web.
1995. Java. Orientación a objetos. Incluye la interfaz JDBC para gestión de bases de datos. La Java Virtual Machine (JVM) es un software específico de cada plataforma hardware que interpreta bytecode (código binario generado por un compilador Java, un código universal, independiente de la máquina).
1995. JavaScript. Lenguaje interpretado orientado a clientes web.
1999. C#. Orientación a objetos. Uno de los lenguajes de programación diseñados para la Infraestructura de Lenguaje Común (este concepto se explica más adelante).
2005. Ruby. Orientación a objetos, imperativo y funcional. Lenguaje simple, de sintaxis elegante y orientado a productividad. Es flexible: los usuarios pueden modificarlo libremente.
Actualmente los lenguajes más populares son Java, C, C++, C#, PHP, Objetive-C, Python, Visual Basic, Perl, Ruby y JavaScript.
Paradigmas de programación
El término “paradigma de programación” data del año 1978, cuando Robert W. Floyd impartió la conferencia “The Paradigms of Programming” con motivo de la concesión del premio Turing, en la que toma prestado el término “paradigma” de la obra de Thomas Kuhn “La Estructura de las Revoluciones Científicas” (1962).
Hay muchos paradigmas de programación: imperativo, funcional, lógico, relacional, orientado a objetos, procedimental, declarativo, concurrente, de flujo de datos (dataflow), genérica, orientado a eventos, orientado a aspectos, orientado a restricciones, reflexiva, visual, etc.
Hay también lenguajes multiparadigma, que contemplan varios paradigmas. Su objetivo es dar libertad al programador para que elija el paradigma que mejor se adapta al problema (o parte del problema), sin necesidad de tener que cambiar de lenguaje. Por ejemplo, C#, soporta los paradigmas imperativo, orientación a objetos y cierto soporte de programación funcional. Otros ejemplos son C++, PHP y Visual Basic, que combinan el paradigma imperativo con la orientación a objetos.
El ejemplo más extremo de lenguaje multiparadigma es Oz, que soporta programación imperativa, lógica, funcional, orientación a objetos, orientación a restricciones, de flujo de datos, concurrente y distribuida. Fue desarrollado durante un periodo de 10 años para intentar combinar de manera armónica los diferentes paradigmas. El Mozart Programming System es una implementación open source (de código abierto) de Oz, que se ha implementado en varios sistemas operativos.
Estos lenguajes multiparadigma no tienen una estructura lingüística común. Y no hay un paradigma universal del que emerjan todos los paradigmas.
Hacia la unificación de hardware y software
De la misma manera que hay lenguajes de programación, también hay lenguajes de descripción de hardware. Y de la misma manera que hay paradigmas de programación, hay paradigmas de diseño de hardware. Parece lógico preguntarse si es posible una cierta unificación entre hardware y software mediante un lenguaje común, con varios objetivos:
Para mejorar la interacción y la cooperación entre hardware y software.
Para hacer un hardware flexible, adaptable al software con el fin de que los procesos sean más eficientes.
Para eliminar el gap semántico entre los lenguajes de hardware y software.
Para diseñar un nuevo sistema operativo software y hardware para conseguir sinergias entre ambos.
Temas destacados en este sentido son:
El codiseño hardware/software. Es un enfoque hacia la unión entre hardware y software que persigue estos objetivos mencionados [Rozenblit & Buchenrieder, 1995] [Micheli & Sami, 1996].
La “computación reconfigurable”. Es una arquitectura computacional que se adapta al software en tiempo de ejecución. Este concepto se remonta a un artículo de Gerald Estrin [1960] en el que propuso una arquitectura hardware formada por un procesador estándar y una serie de componentes hardware reconfigurables por dicho procesador, que se adaptarían en función de la tarea específica a ejecutar, como proceso de imágenes o reconocimiento de patrones. El primer ordenador reconfigurable fue el Algotronix CHS2X4 (1991), que no fue un éxito comercial, pero su tecnología era prometedora.
Xputer. Es una arquitectura de ordenador reconfigurable, propuesto por Reiner Hartenstein. Es una “anti-máquina”, en el sentido que se sitúa en el polo opuesto de la arquitectura von Neumann. Según Hartenstein, se produce una paradoja computacional: con hardware flexible se consigue una mayor velocidad de proceso y menor consumo eléctrico, pero con una frecuencia de reloj sustancialmente menor que con la arquitectura convencional von Neumann.
High-level Language Computer Architecture (HLLCA). Es una arquitectura de ordenador orientada a un lenguaje de programación específico de alto nivel, en lugar de estar orientada solo por consideraciones de hardware. También se denomina “Language-Directed Computer Design”, término acuñado por William McKeeman [1967]. Este tipo de arquitectura fue popular en los años 1960s y 1970s, pero desaparecieron en los años 1980’s, debido principalmente a la aparición de compiladores optimizados, de compiladores just-in-time(compilación en tiempo de ejecución o traducción dinámica), de la arquitectura RISC (Reduced Instruction Set Computing) y de arquitectura CISC (Complex Instruction Set Computing) optimizadas (cuasi-RISC). La HLLCA más conocida es la orientada al lenguaje Lisp. Actualmente, los HLLCAs más populares son los procesadores Java.
Infraestructura de lenguaje común (en inglés, Common Language Infraestructure, CLI) es una especificación que describe un entorno virtual para la ejecución de aplicaciones, en múltiples plataformas hardware y software, y escritos en diferentes lenguajes de alto nivel, sin necesidad de reescribir o recompilar el código fuente. Fue estandarizado por ECMA (2001) y por ISO (2003).
Existen actualmente circuitos programables: Field Programmable Gate Arrays (FPGAs) y Digital Signal Processors (DSPs). Las arquitecturas basadas en circuitos programables se usan para simulación de nuevos diseños hardware antes de materializarlos en un chip ASIC (circuito integrado para aplicaciones específicas, como p.e. la telefonía móvil) o para acelerar la ejecución de computaciones específicas.
MENTAL, un Lenguaje de Programación Universal
Curiosamente, el hardware de los primeros ordenadores fueron creados por hombres. A las mujeres se les asignó el software, el trabajo de programación, por creer que se trataba de una tarea inferior. Pero esta idea no es cierta, es justamente la contraria. Según el Principio de Causalidad Descendente, el software es más importante que el hardware. El hardware es un mero instrumento (físico) para el software, de la misma manera que el cerebro es un mero instrumento para la mente, y la mente es un instrumento de la conciencia. La dicotomía hardware-software es una manifestación de los dos modos de conciencia: analítico y sintético, respectivamente.
Desde el punto de vista de los lenguajes de programación de los ordenadores, MENTAL es el final de una larga marcha: hacia el lenguaje universal y hacia el supremo nivel de abstracción:
Universalidad.
MENTAL es un lenguaje universal, el lenguaje de la conciencia basado en arquetipos primarios. Por lo tanto, es también un lenguaje de programación, pero no un lenguaje de programación particular, sino universal. MENTAL es la solución a la torre de Babel lingüística porque es el lenguaje madre de todos los lenguajes particulares, incluidos los lenguajes de programación. Todos los lenguajes particulares tienen una fundamentación lingüística común.
El juego de instrucciones de la mente y del ordenador son las primitivas semánticas universales, los arquetipos de la conciencia.
Abstracción.
Los lenguajes de programación son abstracciones de máquinas físicas. Es decir, el proceso de abstracción es ascendente: desde lo físico a lo mental, desde el hardware al software. En el caso de MENTAl, el proceso es el contrario. Se parte de unas primitivas, de unos axiomas semánticos y se trata de implementarlos en unas máquinas concretas.
Lenguaje de supremo nivel.
MENTAL es más que un lenguaje de alto nivel; es de supremo nivel. No es posible un nivel de abstracción superior. Con este lenguaje se puede expresar el alto (el general) y el bajo nivel (el de detalle) y todas las abstracciones particulares. MENTAL diluye la distinción entre lenguajes de alto y bajo nivel porque en toda operación intervienen siempre los mismos recursos semántico-sintácticos. También diluye la distinción entre lenguajes declarativos y procedimentales.
Gap semántico.
MENTAL elimina la brecha semántica entre el modo de pensar humano y el lenguaje del ordenador, pues ambos tienen la misma fundamentación: los arquetipos primarios.
Unificación datos-instrucciones.
Con MENTAL no solo se representan en la memoria los datos y las instrucciones del programa, sino que datos y procesos tienen la misma estructura lingüística.
Lo digital ha sido un factor unificador de todo tipo de contenidos, pero los contenidos digitalizados no tienen estructura. MENTAL aporta una estructura común.
Gramática.
Los lenguajes de programación tienen su propia gramática. MENTAL es un lenguaje universal y una gramática universal. La semántica lexical es igual a la semántica estructural, y hay una unión entre sintaxis y semántica, como las dos caras de la misma moneda.
Paradigmas de programación.
MENTAL proporciona un paradigma universal, pues permite expresar paradigmas particulares (imperativo, funcional, lógico, objetual, etc.). MENTAL facilita el trabajo intelectual, hace que el programar sea más fácil que nunca.
Flexibilidad.
Los lenguajes de programación se inventaron para hacer flexible un diseño hardware. Pero todo lenguaje impone restricciones. Recordemos a Wittgenstein: “Los límites de mi lenguaje significan los límites de mi mundo” (Tractatus 5.6). MENTAL como lenguaje de programación representa grados de libertad o dimensiones mentales. Un usuario puede crear un lenguaje a su gusto (definiendo su estructura mediante expresiones genéricas) para hacerlo más legible o adaptarlo a la terminología de cada campo o problema particular. También puede definir las estructuras de control que desee.
Tipos de datos.
El concepto de “tipo de dato” es implementador porque especifica el tipo de valores que se pueden almacenar en una variable (enteros, punto flotante, booleanos, cadenas de caracteres, etc.). En MENTAL no hay tipos de datos, los únicos tipos son las primitivas semánticas.
Palabras clave.
Los lenguajes de programación utilizan palabras clave. MENTAL solo utiliza símbolos para hacerlo independiente de todo idioma particular y para que el código sea compacto.
Inteligencia artificial (IA).
MENTAL es un lenguaje de IA débil (de simulación de la mente humana) porque permite especificar reglas suficientemente genéricas para que el sistema aparente ser inteligente. Además, los programas son fácilmente modificables puesto que la estructura de los programas es la misma que la de los datos.
Hardware.
MENTAL, por su carácter universal, es un lenguaje que permite describir el hardware mediante la sintaxis y la semántica primaria. La semántica secundaria se especifica asignando semántica a los nombres de las variables utilizadas.
Lo ideal es que el hardware se basase en las primitivas semánticas de MENTAL, que el procesador fuera de tipo sintáctico-semántico primario. Un diseño de este tipo sería una máquina analítico-sintética. Si esto no fuera posible, habría que desarrollar para cada plataforma una máquina virtual. El bytecode sería el propio código MENTAL.
Unión software-hardware.
El progreso avanza hacia la unificación, hacia lo universal y hacia la unión de los opuestos. La utilización de un mismo lenguaje para el software y el hardware, debe suponer un avance hacia la unificación de ambos aspectos de las máquinas. Este es un tema que merece la pena investigar, repensar el diseño de los ordenadores desde el paradigma universal que representa MENTAL, para hacer más sencillo el diseño de hardware, de la misma manera que el software.
En definitiva, el lenguaje universal es un evento de mayor importancia que la máquina universal, pues permite expresar todo en un lenguaje formal.
Adenda
Más sobre las notas de Ada
En búsqueda de apoyos para su máquina analítica, Babbage impartió en 1842 una conferencia en el Congreso de Científicos Italianos en Turin. Un ingeniero militar, el capitán Luigi Menabrea (que llegaría a ser primer ministro de Italia) tomó notas de la conferencia y las convirtió en un artículo que fue publicado en francés por la Biblioteca de la Universidad de Ginebra (Suiza) en Octubre de ese mismo año.
Un amigo de Ada le sugirió que tradujera el artículo a inglés, y enseguida aceptó. Cuando la terminó se la enseñó a Babbage, se mostró encantado y sugirió a Ada que, dado que ella conocía en profundidad la máquina analítica, que añadiera algunas notas al documento de Menabrea, y ella aceptó complacida. Sus “Notas de la traductora” acabaron teniendo una extensión de más del doble del documento original. Ada ocultó su identidad bajo las siglas A.A.L. (de Augusta Ada Lovelace).
Las notas de Ada estaban etiquetadas de la A a la G. En la nota G describía el algoritmo para calcular los números de Bernouilli. En 1843 se publicaron en la revista Taylor’s Scientific Memoirs.
En 1953, aproximadamente 100 años después de su muerte, las notas de Ada sobre la máquina analítica fueron republicadas bajo su verdadero nombre.
Las máquinas de Babbage
La máquina analítica tuvo su precedente en otra máquina concebida también por Babbage: la máquina diferencial. Era una máquina diseñada solo para calcular funciones trigonométricas y logarímicas mediante funciones polinómicas con el método de diferencias finitas. En 1991, el Museo de la Ciencia de Londres, siguiendo los planos originales de Babbage, con escasas modificaciones, construyó la máquina diferencial, que demostró ser operativa.
Tras su experiencia con su máquina diferencial (de propósito específico), Babbage concibió una máquina d propósito general: la máquina analítica. El lenguaje de programación que utilizó era similar a los actuales lenguajes ensambladores.
La máquina analítica fue descrita en 1816, pero Babbage la continuó mejorando hasta su muerte en 1871. La máquina analítica fue prácticamente olvidada, salvo por tres ingenieros: Percy Ludgate, Leonardo Torres Quevedo y Vannervar Bush, que independientemente propusieron (a principios del siglo XX) diseños de máquinas analíticas basados en la máquina de Babbage.
Honores de Ada Lovelace
En honor a Ada Lovelace, el Departamento de Defensa de EE.UU. dio el nombre de Ada a su lenguaje de alto nivel orientado a objetos, creado en 1980.
El día de Ada Lovelace es una celebración internacional de los logros de la mujer en ciencia, tecnología, ingeniería y matemática (STEM, por sus siglas en inglés). Se celebra el segundo martes del mes de Octubre de cada año.
La “medalla Lovelace” fue establecida por la British Computing Society en 1998 para distinguir a las personas que hayan realizado contribuciones significativas en el campo de la computación.
Bibliografía
Baum, J. The Calculating Passion of Ada Byron. Archon Books, 1986.
Beyer, Kurt W. Grace Hopper and the Invention of the Information Age. The MIT Press, 2009.
Ditzel, David R.; Patterson, David A. Retrospective on High-Level Language Computer Architecture. ISCA'80 Proceedings of the 7th annual symposium on Computer Architecture. ACM. pp. 97–104, 1980.
Dysson, George. La catedral de Turing. Debate, 2015.
Estrin, Gerald. Organization of computer systems: the fixed plus variable structure computer. Papers presented at the May 3-5, 1960, western joint IRE-AIEE-ACM computer conference. ACM, 1960.
Fuegi, J; Francis, J (October–December 2003). Lovelace & Babbage and the creation of the 1843 ‘notes’. Annals of the History of Computing (IEEE), 25 (4), 2003.
Giloi, Wolfgang, K. Konrad Zuse’s Plankalkül: The First High-Level “non von Neumann” Programming Language. IEEE Annals of the History of Computing, 19 (2): 17-24, April–June, 1997.
Isaacson, Walter. Los innovadores. Debate, 2015.
McKeeman, William M. Language directed computer design. Internet.
Metropolis, N.; Howlet, J.; Rota, Gian-Carlo (eds.). History of computing in the twentieth century. Academic Press, 1980.
Micheli, G. de; Sami, M. (eds.). Hardware/Software Co-Design. Klumer Academic Publishers, 1996.
Neumann, John von. First Draft of a Report on the EDVAC. June 30, 1945. Disponible en Internet.
Rozenblit, J.; Buchenrieder, K. (eds.). Codesign. IEEE Press, 1995.
Toole, Betty A.; Toole, Betty Alexandra. Ada, the Enchantress of Numbers: Prophet of the Computer Age. Strawberry Press, 1998.
Turing, Alan. Intelligent Machinery. National Physical Laboratory, 1948. Disponible en Internet.
Turing, Alan. Intelligent Machinery. A Heretical Theory. Philosophia Mathematica 3 (4): 256-260, 1996. Ensayo póstumo. Disponible en Internet.
Turing, Alan. On computable numbers with an application to the Entscheidungsproblem. Proceedings of the London Mathematical Society, 2 (42): 230-265, 1936. Disponible online.